package utils

import (
	"reflect"
	"strings"
)

func StructToMap(obj interface{}) map[string]interface{} {
	ret := make(map[string]interface{})
	objVal := reflect.ValueOf(obj)
	if objVal.Kind() == reflect.Ptr { // 判断类型是否指针
		objVal = objVal.Elem() // 如果是指针将值取出
	}
	if objVal.Kind() != reflect.Struct { // 判断配型是否结构体
		return nil
	}

	objType := objVal.Type()
	for i := 0; i < objType.NumField(); i++ {
		name := objType.Field(i).Name // 获取主key
		// tag, ok := objType.Field(i).Tag.Lookup("json") // 获取tag"json"的值,获取失败ok=false
		tag := objType.Field(i).Tag.Get("json") // 获取tag"json"的值,获取失败返回""
		if tag != "" {
			index := strings.Index(tag, ",") // 判断tag是否有多个参数,无","返回-1(索引)
			if index == -1 {
				name = tag
			} else {
				name = tag[:index] // 如果tag有多个参数取第一个参为name
			}
		}
		ret[name] = objVal.Field(i).Interface() // 未找到对应tag值直接使用主key
	}
	return ret
}
